package gemsa.servlets.administrateur;

import java.io.IOException;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;
import java.util.Date;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.sql.DataSource;
import gemsa.modeles.ModeleProjet;
import gemsa.outils.GestionDroit;
import gemsa.beans.Projet;
import gemsa.beans.Client;


/**
 * Classe ServletGestionProjets
 * @author Projet Dev Groupe 33
 * @version 1.0 Préfinale
 */

@SuppressWarnings("serial")
public class ServletGestionProjets extends HttpServlet 
{
	// Variables de la classe
	private DataSource datasource=null;
	private GestionDroit gestionDroit=null;
	
	// Traitements 
	public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException
	{		
		// Initialisation de la gestion des droits 
		gestionDroit=new GestionDroit(request);
		
		// On autorise uniquement les administrateurs
		if(!gestionDroit.estAutorise(true,false,false))
		{	
			getServletContext().getRequestDispatcher("/pageFixe?action=erreur&erreurs=Vous n'êtes pas autorisé à afficher cette page!").forward(request, response);
		}
		else
		{		
			// R�cup�rer l'objet datasource du context de la servlet 
			datasource=(DataSource)getServletContext().getAttribute("datasource");
			
			// Action a r�aliser 
			String action=(String)request.getParameter("action");
			
			// Action par d�faut (liste) 
			if(action==null || action.equalsIgnoreCase(""))
			{
				action="lister";
			}
			
			// Listing des projets 
			if(action.equals("lister"))
			{
				listerProjet(request,response);
			}
			
			// Consultation d'un projet 
			if(action.equals("consulter"))
			{
				consulterProjet(request,response);
			}
			
			// Affiche le formulaire de modification d'un projet 
			if(action.equals("modifier"))
			{
				modifierProjet(request,response);
			}
			
			// Valider la modification d'un projet 
			if(action.equals("validermodification"))
			{
				validerModification(request,response);
			}
		}
		
		// Vider le datasource 
		this.datasource=null;
	}
	
	
	// Lister les projets
	private void listerProjet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
	{
		// Variables 
		int page=0;
		int maxParPage=0;
		String champTri=null;
		String typeTri=null;
		String recherche=null;
		String typerecherche=null;
		ModeleProjet modeleProjet=null;
		ArrayList<Projet> listeProjets=null;
		
		try 
		{
			// On récupèe la page demandée
			page=Integer.parseInt(request.getParameter("page").trim());
			
			// Si la page vaut 0 ou inférieur on prend la valeur 1 
			page=Math.max(page,1);
		}
		catch (Exception e) 
		{
			// Si dans la requete l'attribut page n'est pas un nombre, on initialise la page � 1 
			page=1;
		}
		
		try 
		{
			// On récupère le maximum d'éléments à afficher 
			maxParPage=Integer.parseInt(request.getParameter("maxParPage").trim());
			
			// Si maxParPage est inférieur à 5, on renvoie 5 
			maxParPage = Math.max(maxParPage, 5);
		}
		catch (Exception e) 
		{
			// Si dans la requete le paramètre n'est pas un nombre, on initialise le maximum d'élément à 20 
			maxParPage=20;
		}
	
		// On récupère le reste des �l�ments de la requete 
		recherche=(String)request.getParameter("recherche");
		typerecherche=(String)request.getParameter("typerecherche");
		champTri=(String)request.getParameter("champTri");
		typeTri=(String)request.getParameter("typeTri");
				
		// Si aucun tri n'est pas demand�, ou que le tri est incorrect, on r�alise un tri sur l'id du projet 
		if(champTri==null || (!champTri.equals("datecreationprojet") && !champTri.equals("identifiantclient") && !champTri.equals("etatprojet") && !champTri.equals("totalpoids") && !champTri.equals("totalprojet") && !champTri.equals("id_projet")))
		{
			champTri="id_projet";
		}
		
		// Si aucun type de tri n'est demand�, ou que le type de tri est incorrect, on r�alise un tri croissant 
		if(typeTri==null || (!typeTri.equals("ASC") && !typeTri.equals("DESC")))
		{
			typeTri="ASC";
		}
	
		// On initialise le modèle 
		modeleProjet=new ModeleProjet(datasource);
		
		// On récupère la liste des projets avec le modèle 
		listeProjets=(ArrayList<Projet>)modeleProjet.listerProjet(maxParPage, page, recherche,typerecherche, champTri, typeTri);
		
		// On renvoie � la JSP la liste des projets ainsi que les informations de pagination 
		request.setAttribute("listeProjets",listeProjets);
		request.setAttribute("maxParPage", modeleProjet.getMaxParPage());
		request.setAttribute("pageActuel", modeleProjet.getPageActuel());
		request.setAttribute("totalElement", modeleProjet.getTotalElement());
		request.setAttribute("champTri", modeleProjet.getChampTri());
		request.setAttribute("typeTri", modeleProjet.getTypeTri());
		request.setAttribute("recherche", modeleProjet.getRecherche());
		request.setAttribute("typerecherche", modeleProjet.getTyperecherche());
		
		// On renvoie de plus � la vue les messages d'erreurs ou de succ�s
		request.setAttribute("succes",(String)request.getParameter("succes"));
		request.setAttribute("erreurs",(String)request.getParameter("erreurs"));
		
		// On vide la liste des projets par s�curit�
		listeProjets=null;
		
		// On renvoie la page de listing des projets 
		getServletContext().getRequestDispatcher("/vues/administrateurs/listeprojets.jsp").forward(request,response);
	}
	
	
	
	// Consulter un projet
	private void consulterProjet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException
	{
		// Variables
		Projet projet=null;
		ModeleProjet modeleProjet=null;
		int idProjet=0;
		
		try
		{
			// On récupère le projet
			idProjet=Integer.parseInt(request.getParameter("idProjet"));
		}
		catch (Exception e) 
		{
			// Le projet n'existe pas
			idProjet=0;
		}
		
		// On initialise le modèle
		modeleProjet=new ModeleProjet(datasource);
		
		// On récupère le projet depuis le modèle : renvoie null s'il n'existe pas
		projet=modeleProjet.consulterProjet(idProjet);
		
		// Si le projet n'existe pas on renvoie sur la page de listing des projets 
		if(projet!=null)
		{
			// On ajoute le projet � la requete 
			request.setAttribute("projet", projet);
			
			// On redirige sur la vue de consultation du projet 
			getServletContext().getRequestDispatcher("/vues/administrateurs/consulterprojet.jsp").forward(request,response);
		}
		else
		{
			// On renvoie sur le la liste des projets avec un message d'erreur 
			response.sendRedirect("administrationProjets?action=lister&erreurs=" + "Ce projet n'existe pas");
		}
	}
	
	
	// Modifier un projet
	private void modifierProjet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException
	{
		// Variables 
		Projet projet=null;
		ModeleProjet modeleProjet=null;
		int idProjet=0;
		
		try
		{
			// On récupère le projet 
			idProjet=Integer.parseInt(request.getParameter("idProjet"));
		}
		catch (Exception e) 
		{
			// Le projet n'existe pas 
			idProjet=0;
		}
		
		// On initialise le modèle 
		modeleProjet=new ModeleProjet(datasource);
		
		// On récupère le projet depuis le modèle : renvoie null s'il n'existe pas
		projet=modeleProjet.consulterProjet(idProjet);
		
		// Si le projet n'existe pas on renvoie sur la page de listing des projets 
		if(projet!=null)
		{
			// On ne peut pas modifier un projet valid� 
			if(projet.getEtat()==0)
			{
				// On ajoute le projet � la requete 
				request.setAttribute("projet", projet);
				
				// On redirige sur la vue de modification du projet 
				getServletContext().getRequestDispatcher("/vues/administrateurs/modifierprojet.jsp").forward(request,response);
			}
			else
			{
				// On renvoie sur la liste des projets avec un message d'erreur 
				response.sendRedirect("administrationProjets?action=lister&erreurs=" + "Ce projet ne peut plus �tre modifi�");
			}
		}
		else
		{
			// On renvoie sur le la liste des projets avec un message d'erreur 
			response.sendRedirect("administrationProjets?action=lister&erreurs=" + "Ce projet n'existe pas");
		}
	}
	
	
	// Valider modifier un projet
	private void validerModification(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException
	{
		// Variables 
		int codeErreur=0;
		Projet projet=null;
		Client client=null;
		ModeleProjet modeleProjet=null;
		List<String> erreurs=null;
		Enumeration parametres=null;
		String parametre=null;
		String nom=null;
		String prenom=null;
		
		// On récupère les informations du formulaire sur lesquels on va appliquer une validation
		nom=request.getParameter("nom").trim();
		prenom=request.getParameter("prenom").trim();
		
		// Initialisation de la collection d'erreurs 
		erreurs=new ArrayList<String>();
		
		// On vérifie que le nom est renseign� 
		if(nom.equals("") || nom==null)
		{
			erreurs.add("Le param�tre [nom] est vide");
		}
		else if(!nom.matches("\\p{L}+([ -]?\\p{L}+)+"))
		{
			erreurs.add("Le param�tre [nom] contient une erreur de syntaxe");
		}
			
		// On vérifie que le pr�nom est renseign�
		if(prenom.equals("") || prenom==null)
		{
			erreurs.add("Le param�tre [prenom] est vide");
		}
		else if(!prenom.matches("\\p{L}+([ -]?\\p{L}+)+"))
		{
			erreurs.add("Le param�tre [prenom] contient une erreur de syntaxe");
		}
		
		// On regarde le nombre d'erreurs, s'il y en a au moins une on retourne � la page de modification d'un projet 
		if(erreurs.size()>0)
		{
			// On ajoute tous les attributs du formulaire dans la requ�te 
			parametres=request.getParameterNames();
			while (parametres.hasMoreElements()) 
			{
				parametre=(String)parametres.nextElement();
			    request.setAttribute(parametre,(String)request.getParameterValues(parametre)[0]);
			}
			
			// On ajoute la collection d'erreurs 
			request.setAttribute("erreurs", erreurs);
			
			// On renvoie à la vue de modification d'un projet 
			getServletContext().getRequestDispatcher("/vues/administrateurs/modifierprojet.jsp").forward(request,response);
		}
		else
		{
			// On créé un nouvel objet client 
			client=new Client();
			client.setId(Integer.parseInt(request.getParameter("idClient")));
			client.setNom(nom);
			client.setPrenom(prenom);

			// On cr�e un nouvel objet projet � partir des informations du formulaire 
			projet=new Projet();
			projet.setId(Integer.parseInt(request.getParameter("idProjet")));
			projet.setEtat(Integer.parseInt(request.getParameter("etat")));
			projet.setDateModification(new Date());
			projet.setClient(client);
			
			// Initialisation du modèle 
			modeleProjet=new ModeleProjet(this.datasource);
			
			// On met à jour le projet 
			codeErreur=modeleProjet.modifierProjet(projet);
			
			// On teste si la modification a été effectuée avec succès 
			if(codeErreur!=1)
			{
				// On renvoie à la vue de listing des projets avec un message d'erreur 
				response.sendRedirect("administrationProjets?action=lister&erreurs=" + "Une erreur s'est produite durant la modification des informations du projet. Veuillez recommencer");
			}
			else
			{
				// On renvoie à la vue de listing des projets avec un message de succ�s 
				response.sendRedirect("administrationProjets?action=lister&succes=" + "Les informations du projet ont été enregistrées avec succès");
			}
		}
	}
	
	public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException
	{
		doGet(request, response);
	}
	
	
	
}